home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Tools / Dev / mamesrc / include / moo.h < prev   
C/C++ Source or Header  |  1999-12-03  |  3KB  |  109 lines

  1. #ifndef MOO_H
  2. #define MOO_H
  3. /**************************************************************************
  4.  *
  5.  * Copyright (C) 1999 Mats Eirik Hansen (mats.hansen@triumph.no)
  6.  *
  7.  * $Id$
  8.  *
  9.  * $Log$
  10.  *
  11.  *************************************************************************/
  12.  
  13. #include <stdio.h>
  14.  
  15. typedef enum
  16. {
  17.   false,
  18.   true
  19. } bool_t;
  20.  
  21. typedef void *(*clone_f)(void *obj, int clone_state);
  22. typedef void (*dispose_f)(void *obj);
  23.  
  24. typedef struct
  25. {
  26.   clone_f   Clone;
  27.   dispose_f Dispose;
  28.   size_t    Size;
  29.   uint      Flags;
  30.   int       RefCount;
  31. } obj_t;
  32.  
  33. #define OBJF_ALLOCATED 1
  34. #define OBJF_DISPOSED  2
  35.  
  36. obj_t  *objClone(obj_t *this, bool_t clone_state);
  37. void   objDispose(obj_t *this);
  38. bool_t objPostInit(obj_t *this);
  39. void   objSetSize(obj_t *this, size_t size);
  40. bool_t objInit(obj_t *this);
  41. obj_t  *objNew(size_t size);
  42.  
  43. #define Dispose(obj) (((obj_t *)(obj))->Dispose(obj))
  44.  
  45. /* If clone_state = true then the entire state of the object is cloned so
  46.  * the new object is identical to the original. Otherwise only the initial
  47.  * state is cloned. */
  48.  
  49. #define Clone(obj, clone_state) (((obj_t *)(obj))->Clone(obj, clone_state))
  50.  
  51. /* If a class does Dispose() on objects that weren't created by the class
  52.  * itself then IncRefCount() must be used on such object. If this is not done
  53.  * then an object will be free while it still may be in use somewhere else. */
  54.  
  55. #define IncRefCount(obj) (++(((obj_t *)(obj))->RefCount))
  56.  
  57. /* All classes should do a if(DecRefCount(this) <= 0) in the dispose function to make
  58.  * sure that the object is only freed when it's no longer in use. */
  59.  
  60. #define DecRefCount(obj) (--(((obj_t *)(obj))->RefCount))
  61.  
  62. typedef struct
  63. {
  64.   obj_t Obj;
  65.   char  *Buf;
  66.   uint  Length;
  67.   uint  MaxLength;
  68.   uint  MinLength;
  69. } string_t;
  70.  
  71. #define STRE_OK    0
  72. #define STRE_NOMEM 1
  73.  
  74. /* string API: */
  75.  
  76. bool_t   stringInit(string_t *this, char *str, uint min_len);
  77. string_t *stringNew(char *str, uint min_len);
  78. char     *stringGet(string_t *string);
  79. int      stringAdd(string_t *string, uint tail, char *strs,...);
  80. void     stringClear(string_t *string);
  81. int      stringSet(string_t *string, char *str);
  82. #define  stringAddHead(string,str) stringAdd(string,0,str,(char *)NULL)
  83. #define  stringAddTail(string,str) stringAdd(string,1,str,(char *)NULL)
  84.  
  85. /* DEBUG_OBJVALID should be used at the top of every method except New, Init and Dispose.
  86.  * DEBUG_DISPOSEOBJVALID should be used in Dispose because it's normal that the RefCount
  87.  * is < 0 in Dispose. */
  88.  
  89. #ifdef DEBUG
  90. #define DEBUG_OBJVALID(funcname,obj)    if(!(obj) || (((obj_t *)(obj))->RefCount < 0)) \
  91. { \
  92.   printf("DEBUG_ERROR: Invalid object pointer in "funcname" (\""__FILE__"\" line %d).\n", __LINE__); \
  93.   if(obj) puts("RefCount < 0."); \
  94.   else puts("NULL pointer."); \
  95.   puts("Press [Return] to continue."); \
  96.   getchar(); \
  97. }
  98. #define DEBUG_DISPOSEOBJVALID(class,obj)  if(!(obj)) \
  99. { \
  100.   printf("DEBUG_ERROR: Invalid object pointer in "class"Dispose (\""__FILE__"\" line %d).\nNULL pointer.\nPress [Return] to continue", __LINE__); \
  101.   getchar(); \
  102. }
  103. #else
  104. #define DEBUG_OBJVALID(funcname,obj)
  105. #define DEBUG_DISPOSEOBJVALID(class,obj)
  106. #endif
  107.  
  108. #endif
  109.